package com.xzcedu.inputstream_;

import org.junit.jupiter.api.Test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @author 徐州城
 * @version 1.0
 * 演示文件输入流操作(字节输入流 文件-->程序)
 */
public class FileInputStream_ {
    public static void main(String[] args) {

        byte[] bytes = {'x','s',3,4};
        //offset:在bytes数组中下标从0开始，后往后两位
        String s = new String(bytes, 0, 2);
        System.out.println(s);
    }


    /**
     * 演示读取文件
     * 单个字节的读取，效率比较低
     * -> 使用read(byte[] b)
     */
    @Test
    public void readFile01() {
        String filePath = "e:\\hello.txt";
        int readDate = 0;
        FileInputStream fileInputStream = null;
        try {
            //创建 FileInputStream 对象，用于读取 文件
            fileInputStream = new FileInputStream(filePath);
            //read()：从该输入流读取一个字节的数据。如果没有输入可用，次方法将阻止
            //如果返回-1，表示读取完毕
            while ((readDate = fileInputStream.read()) != -1) {
                System.out.print((char) readDate);//转成char显示
            }

        } catch (IOException e) {
            e.printStackTrace();

        } finally {

            //关闭文件流，释放资源
            try {
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    /**
     * 使用read(byte[] b) 读取文件
     */
    @Test
    public void readFile02() {
        String filePath = "e:\\hello.txt";
        int readDate = 0;
        //字节数组
        byte[] buf = new byte[8];//一次读取8个字节
        int readLength = 0;

        FileInputStream fileInputStream = null;
        try {
            //创建 FileInputStream 对象，用于读取 文件
            fileInputStream = new FileInputStream(filePath);
            //read(byte[] b)：从该输入流取最多b.length字节到数组。此方法阻塞，直到某些输入可用
            //如果返回-1，表示读取完毕
            //如果返回正常，返回实际读取的字节数
            while ((readLength = fileInputStream.read(buf)) != -1) {
                System.out.println(new String(buf, 0, readLength));//转成char显示
            }

        } catch (IOException e) {
            e.printStackTrace();

        } finally {

            //关闭文件流，释放资源
            try {
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //FileOutputStream
    }
}
